💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    15 시리얼라이저로 피드데이터출력(DRF vs 일반 뷰 비교) | ✅ 편저: 코담 운영자

    15강 - 시리얼라이저로 피드 데이터 출력 (DRF vs 일반 뷰 비교)

    데이터 출력 with Serializers


    ✨ 이번 강의 목표

    • Django REST Framework(DRF)를 활용해 피드 데이터를 JSON으로 구조화
    • DRF 기반 View와 일반 Django 함수형 뷰 비교
    • CSRF 토큰 처리 포함한 고급 직렬화 구현

    1. Django REST Framework 설치 및 설정

    1) 설치

    pip install djangorestframework
    pip install markdown       # Markdown 지원
    pip install django-filter  # 필터링 기능
    

    2) settings/base.py 설정

    THIRD_PARTY_APPS = [
        ...
        "rest_framework",
    ]
    

    (※ 일반 장고 프로젝트일 경우 INSTALLED_APPS에 바로 추가)


    2. API 폴더 구조 및 URL 설정

    posts/
    ├── api/
    │   ├── serializers.py  # 직렬화기 정의
    │   ├── views.py        # APIView, ListAPIView 등
    │   ├── urls.py         # API URL 등록
    

    posts/api/urls.py

    from django.urls import path
    from .views import PostListView, PostDetailView
    
    app_name = "posts_api"
    
    urlpatterns = [
        path("posts/", PostListView.as_view(), name="posts-list"),
        path("posts/<int:pk>/", PostDetailView.as_view(), name="posts-detail"),
    ]
    

    config/urls.py 등록

    path("api/", include(("django_instagram.posts.api.urls", "posts_api"), namespace="posts_api")),
    

    3. DRF 기반 API View - PostListView

    posts/api/views.py

    from django.shortcuts import get_object_or_404
    from rest_framework.response import Response
    from rest_framework import status, generics, permissions
    from django.db.models import Q
    from .serializers import PostSerializer
    from django_instagram.users.models import User as user_model
    from django_instagram.posts.models import Post
    
    class PostListView(generics.ListAPIView):
        serializer_class = PostSerializer
        permission_classes = [permissions.IsAuthenticated]
    
        def get_queryset(self):
            user = get_object_or_404(user_model, pk=self.request.user.id)
            following = user.following.all()
            return Post.objects.filter(Q(author__in=following) | Q(author=user))
    
        def list(self, request, *args, **kwargs):
            queryset = self.get_queryset()
            serializer = self.get_serializer(queryset, many=True, context={'request': request})
            return Response({"posts": serializer.data}, status=status.HTTP_200_OK)
    

    4. 일반 Django FBV 방식

    posts/views.py

    @api_view(['GET'])
    def posts_list_view(request):
        if request.method == 'GET':
            user = get_object_or_404(user_model, pk=request.user.id)
            following = user.following.all()
            followed_posts = models.Post.objects.filter(Q(author__in=following) | Q(author=user)).order_by('-created_at')
    
            serializer = PostSerializer(followed_posts, many=True, context={'request': request})
            login_user_serializer = UserSerializer(request.user, context={'request': request})
    
            return JsonResponse({
                "posts": serializer.data,
                "loginUser": login_user_serializer.data
            }, status=200)
    

    ✅ 차이점: DRF는 Response, FBV는 JsonResponse 사용 / View 클래스 방식 vs 함수형 방식


    5. 시리얼라이저 구현 (serializers.py)

    from rest_framework import serializers
    from django_instagram.users.models import User as user_model
    from .. import models
    from django.middleware.csrf import get_token
    
    class FeedAuthorSerializer(serializers.ModelSerializer):
        class Meta:
            model = user_model
            fields = ("id", "username", "profile_photo")
    
    class CommentSerializer(serializers.ModelSerializer):
        author = FeedAuthorSerializer()
    
        class Meta:
            model = models.Comment
            fields = ("id", "contents", "author")
    
    class PostSerializer(serializers.ModelSerializer):
        comment_post = CommentSerializer(many=True)  # related_name='comment_post' 필요
        author = FeedAuthorSerializer()
        csrf_token = serializers.SerializerMethodField()
    
        class Meta:
            model = models.Post
            fields = (
                "id", "image", "caption", "image_likes", "author", "comment_post", "csrf_token"
            )
    
        def get_csrf_token(self, obj):
            request = self.context.get('request')
            return get_token(request) if request else None
    

    6. 템플릿 예시 (posts/main.html)

    {% for post in posts %}   
     <div class="text-left">
        <p>{{ post.author.id }}</p>
        <p>{{ post.author.username }}</p>
        <p>{{ post.author.profile_photo }}</p>
        <p>{{ post.id }}</p>
        <p>{{ post.image }}</p>
        <p>{{ post.caption }}</p>
        <br/>
        <strong>댓글 목록</strong>
        {% for comment in post.comment_post %}
            <p>{{ comment.id }}</p>
            <p>{{ comment.contents }}</p>
            <p>{{ comment.author.id }}</p>
        {% endfor %}
        <hr/>
    </div>      
    {% endfor %}
    

    7. CSRF 토큰 관련 처리

    • 시리얼라이저 내부에서 SerializerMethodField로 CSRF 토큰 반환
    • context={'request': request} 반드시 전달
    • 미들웨어 CsrfViewMiddleware 활성화 필수

    예외 처리용 코드

    from django.middleware.csrf import get_token
    from django.http import HttpRequest
    
    def get_csrf_token(self, obj):
        request = self.context.get('request')
        if request and hasattr(request, 'META'):
            return get_token(request)
        dummy_request = HttpRequest()
        return get_token(dummy_request)
    

    ✅ DRF vs 일반 Django 뷰 비교 요약

    항목 DRF 일반 Django
    직렬화 ModelSerializer 자동 수동 JsonResponse 처리
    인증/권한 permission_classes 제공 직접 구현 필요
    브라우저 테스트 Browsable API 제공 없음
    URL 관리 ViewSet + Router 가능 URL 별도 등록

    ✔️ 선택 기준

    상황 추천 방식
    대규모 API 개발, 인증 필요 ✅ DRF
    간단한 JSON 응답만 필요 ✅ 일반 FBV

    ✅ 정리

    • DRF를 사용하면 관계형 데이터(Post-Comment-User)를 구조화된 JSON으로 쉽게 직렬화 가능
    • FBV는 간단한 로직엔 가볍지만, 인증/보안/성능 측면에서 DRF보다 약함
    • CSRF 토큰은 HTML 기반 View와 연동 시 필요하며, Serializer에서 동적으로 주입 가능

    👉 다음 강의에서는 댓글 등록 및 Ajax와의 연동 방식을 다룹니다.

    TOP
    preload preload